iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 16
1

套件

前面介紹很多 go 語言程式設計的相關內容,但是如果把所有程式碼塞在一個 .go 的檔案之中這一篇文章要跟大家介紹如何將 go 語言的代碼分散到各個程式碼中。

本文同步放置於此

使用套件來分配程式碼

在認識那麼多 go 的語法後,如何讓專案快速開發是所有的程式設計師所嚮往的技能,所以這邊跟大家介紹 package 這個語法,相信在第一個 Hello World 就有看到這個關鍵字,接下來要跟大家介紹這關鍵字,以及如何使用這關鍵字來管理專案的程式碼。

套件的撰寫

說到套件 package 這關鍵字,這裡再來複習一下Go Tour的第一個Hello Wolrd的程式碼,請大家看一下下列程式碼

package main

import "fmt"

func main() {
	fmt.Println("Hello, 世界")
}

這最上面就是宣告說目前的套件是 main 這個套件,其實這 package 就類似 cc++c#namespace ,在命名空間可以看到這是用來宣告目前程式的可視範圍,也就是讓程式知道這段程式在哪個地方可以被執行。接下來 import 就是把其他 package 導進來使用,例如這邊導入了 fmt 這個套件,並引用 fmtPrintln方法。

程式進入點

前面一個段落告訴大家 package 的功用,這邊在跟大家說明 main 這個套件是必要的,因為這是所有 go 程式的程式進入點,在 main 這個 packagemain 方法是程式進入點,所有程式都由這方法開始執行。介紹完主要的 package 之後,接下來跟大家說明如何將程式分別寫在其他的 .go 檔。

程式的分割管理

上面介紹程式的進入點,如果說所有的程式都寫在程式進入點,這樣子管理起來應該會很困擾,所以我們把程式寫在其他的 .go 檔,然後在 main 裡面呼叫我們所寫的程式。這裡要先跟大家說明一下 package 的命名規則是小寫英文字,所以這邊我們寫一個 pkg 的 package 如下面例子

package pkg

var Hello = "Hello"

func SayHello() string {
	return "Hello2"
}

上面我們撰寫一個pkg的套件,其中我們宣告一個全域變數 Hello 以及一個方法 SayHello,接下來我們存檔在 hello.go 這檔案,我們的目錄結構如下

main/
├── pkg/
│   ├──hello.go
├── hello.go

最後我們main.go的內容如下

package main

import (
	"fmt"
	"main/pkg"
)

func main(){
	fmt.Println("Hello, world")
	fmt.Println(pkg.Hello)
	fmt.Println(pkg.SayHello())
}

上面例子說明在程式進入點中,如何透過 import 把我們撰寫在 pkg\hello.go 的程式碼給引用進來並且使用,這裡注意 Hello 的全域變數,讀者們可以試著把他改成 hello,並編譯看看,應該會發現編譯不過,因為命名的不同所代表的存取權限就不同,其中 Hello 字首大寫 為 public,相對的字首小寫 hello 則為 private,所以在撰寫 go 的語法要注意命名。

資料夾的規劃

在說明完如何將 go 的程式做一個切分後,接下來要說明一個好的專案結構的開始是一個專案成功的一半,所以專案結構就是說明專案內的程式要怎麼擺放,這邊可以看看 project-layout 建議的專案目錄結構,相信有一個大家認同的專案結構開發起來會事半功倍。

套件的初始化

當然有時候程序會做一些初始化設定,當然這程序必須是在載入該套件時就要被執行的程式碼,接下來的例子是告訴大家如何做到,請大家先看一下下列例子


package pkg

var Hello = "Hello"

func init() {
    fmt.Println("This is pkg init")
}

func SayHello() string {
	return "Hello2"
}

如此在上面的套件被引用時他的init就會被執行,除此之外main也可以有初始化函式,他的寫法跟套件一樣,大家可以看一下下列例子

package main

import (
	"fmt"
	"main/pkg"
)

func init() {
    fmt.Println("This is main init")
}

func main(){
	fmt.Println("Hello, world")
	fmt.Println(pkg.Hello)
	fmt.Println(pkg.SayHello())
}

每個套件的init被執行的順序是依照import的順序,等到最後被import套件的init被執行後才會執行mianinit

結論

這篇文章介紹如何將 go 的程式碼做切分,並且說明存取權限是如何設置的,最後跟大家介紹一個許多人認可專案結構,希望對大家的 go 專案開法有所幫助。


上一篇
執行序的鎖
下一篇
go的 模組
系列文
Iris這個在go語言上地表最快的網頁框架30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言